//#include <iostream>
//#include <string>
//#include <cmath>
//using namespace std;
//
//int l, r;
//
//bool check(int x)
//{
//	string s = to_string(x);
//	int n = s.size();
//	for(int i = 1; i < n; i++)
//	{
//		string s1 = s.substr(0, i), s2 = s.substr(i, n);
//		int n1 = stoi(s1), n2 = stoi(s2);
//		int t0 = sqrt(x), t1 = sqrt(n1), t2 = sqrt(n2);
//		if(n2 != 0 && t0 * t0 == x && t1 * t1 == n1 && t2 * t2 == n2) 
//			return true;
//	}
//	return false;
//}
//int main()
//{
//	cin >> l >> r;
//	for(int i = l; i <= r; i++)
//	{
//		if(check(i)) {
//			cout << i << endl;
//		}
//	}
//	return 0;
//}


#include <iostream>
using namespace std;

const int N = 510;
const int MOD = 123456;
int dp[N][N];
int n, k;

int main()
{
	cin >> n >> k;
	dp[1][0] = 1;
	for(int i = 2; i < n; i++)
	{
		dp[i][0] = 2;
		for(int j = 0; j <= k; j++)
		{
			dp[i + 1][j] += dp[i][j] * (j + 1) % MOD;
			dp[i + 1][j + 1] += dp[i][j] * 2 % MOD;
			dp[i + 1][j + 2] += dp[i][j] * (i - j - 2) % MOD;
		}
	}
	cout << dp[n][k - 1] % MOD;
	return 0;
}
